#include "DemiOrque.h"

#include <iomanip>

#include <boost/assign/list_of.hpp>

using namespace std;
using namespace boost::assign;

const unsigned DemiOrque::nbrEnsembles = 1;

const unsigned DemiOrque::nbrCapacites = 1;

const unsigned DemiOrque::ppAlloues = 15;

const vector< vector< unsigned > > DemiOrque::ensembleRacial =
  list_of< vector< unsigned > >( list_of(5) );

const unsigned DemiOrque::taille = 6;

/**
 * Contient les capacités, puis les ensembles raciaux, à la fin.
 */
const vector< CapaciteRaciale > DemiOrque::Liste = list_of
  ( CapaciteRaciale( "Agressivité"        ,  5 ) )
  ( CapaciteRaciale( "Brutalité"          ,  5 ) )
  ( CapaciteRaciale( "Détection minière"  ,  5 ) )
  ( CapaciteRaciale( "Goût développé"     ,  5 ) )
  ( CapaciteRaciale( "Infravision"        , 10 ) )
  ( CapaciteRaciale( "Odorat développé"   ,  5 ) )
  ( CapaciteRaciale( "Demi-Orque standard", 10 ) );

/**
 * Contient la liste des ensembles raciaux (ici un seul).
 */
const vector< EnsembleCapacitesRaciales > DemiOrque::Ensembles = list_of
  ( EnsembleCapacitesRaciales( "Demi-Orque standard", 10, ensembleRacial[0] ) );

const vector< Prerequis > DemiOrque::Limites = list_of
  ( Prerequis(0, 6, 18 ) )
  ( Prerequis(1, 3, 17 ) )
  ( Prerequis(2, 8, 18 ) )
  ( Prerequis(3, 3, 17 ) )
  ( Prerequis(4, 3, 14 ) )
  ( Prerequis(5, 3, 12 ) );

/**
 * Les Demi-Orques ont +1 en Force et en Constitution, -2 en Charisme.
 */
const map< unsigned, int > DemiOrque::AjustTraits = map_list_of
  ( 0, 1 )
  ( 2, 1 )
  ( 5, -2 );

/**
 * Constructeur simplifié, qui remplit simplement le conteneur des capacités.
 * Il est utilisé lors de la lecture d'un fichier XML.
 *
 * @param[in] cap conteneur des capacité
 */
DemiOrque::DemiOrque(const vector<unsigned>& cap)
  :Race("Demi-Orque")
{
  NombrePPsAlloues = ppAlloues;

  CapacitesRaciales    = Liste;
  NombreTotalCapacites = taille;
  EnsemblesRaciaux     = Ensembles;
  NombreTotalEnsembles = nbrEnsembles;
  NombreMaxCapacites   = nbrCapacites;
  PrerequisRaciaux     = Limites;

  AjustementsRaciaux = AjustTraits;

  Capacites.assign( cap.begin(), cap.end() );
}

/**
 * Constructeur usuel, qui permet de créer un Demi-Orque en sélectionnant
 * ses capacités.
 * @param PP nombre de pp, passé en argument afin de pouvoir récupéré les
 * pp non dépensé
 */
DemiOrque::DemiOrque(unsigned& PP)
  :Race("Demi-Orque")
{
  NombrePPsAlloues = ppAlloues;

  CapacitesRaciales    = Liste;
  NombreTotalCapacites = taille;
  EnsemblesRaciaux     = Ensembles;
  NombreTotalEnsembles = nbrEnsembles;
  NombreMaxCapacites   = nbrCapacites;
  PrerequisRaciaux     = Limites;

  AjustementsRaciaux = AjustTraits;

  blank() << setfill('*') << setw(56) << '*' << endmsg;
  blank() << "Création d'un demi-orque" << endmsg << endmsg;

  PP += 15;
  construitRace( PP );
  
  blank() << endmsg << setfill('*') << setw(56) << '*' << endmsg;
}

DemiOrque::DemiOrque()
  :Race("Demi-Orque")
{
  NombrePPsAlloues = ppAlloues;

  CapacitesRaciales    = Liste;
  NombreTotalCapacites = taille;
  EnsemblesRaciaux     = Ensembles;
  NombreTotalEnsembles = nbrEnsembles;
  NombreMaxCapacites   = nbrCapacites;
  PrerequisRaciaux     = Limites;

  AjustementsRaciaux = AjustTraits;
}

/**
 * Constructeur de "copie", qui permet de créer une instance à partir
 * de MetaClasse.
 *
 * @param ptr pointeur sur l'instance à copier.
 */
DemiOrque::DemiOrque(Race *ptr)
  : Race( *ptr )
{}

/**
 * Destructeur, ne fait rien de spécial.
 */
DemiOrque::~DemiOrque()
{}
